package com.blumov.fastbox.domain.model.producto;

import com.blumov.fastbox.domain.shared.ValueObject;


/**
 * Un Producto.
 * 
 * @author Bruno Masci
 * TODO: Armar hbm para manejar esta clase como abstracta
 */
public class Producto implements ValueObject<Producto> {

	private static final long serialVersionUID = 1L;

	// Needed by Hibernate
	private Integer id;

	private String codigo;
	private String nombre;
	private String descripcion;
	private String tamanio;
	private Integer precio;
	private String tipo;

	// Null object pattern
	public static final Producto NONE = new Producto("");
	
	
	Producto() {
		// Needed by Hibernate
	}
	
	public Producto(String codigo) {
		this.codigo = codigo;	
	}
	
	/**
	 * Obtiene el precio de este producto
	 */
	public Integer getPrecio() {
		return this.precio;
	}

	// Getters & setters
	
	public Integer getId() {
		return id;
	}
	
	public void setPrecio(Integer precio) {
		this.precio = precio;
	}
	
	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public String getTamanio() {
		return tamanio;
	}

	public void setTamanio(String tamanio) {
		this.tamanio = tamanio;
	}

	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}

	public void setId(Integer id) {
		this.id = id;
	}
	
	public boolean sameValueAs(Producto other) {
		return 
				other != null && 
				codigo.equals(other.codigo) &&
				nombre.equals(other.nombre) &&
				descripcion.equals(other.descripcion) &&
				tamanio.equals(other.tamanio) &&
				precio.equals(other.precio) &&
				tipo.equals(other.tipo);
	}
	
	  @Override
	  public boolean equals(final Object o) {
	    if (this == o) return true;
	    if (o == null || getClass() != o.getClass()) return false;

	    final Producto producto = (Producto) o;

	    return sameValueAs(producto);
	  }

	  @Override
	  public int hashCode() {
	    return codigo.hashCode();		// TODO: HashCodeBuilder (apache)
	  }
}
